package v1

import (
	. "gintify/core"
	"gintify/model"
	"gintify/response"
	"github.com/gin-gonic/gin"
	"strconv"
)

type IApiController interface {
	IRestController
}

type ApiController struct {
	// 空结构体
}

func isApiExist(path string, method string) bool {
	var api model.SysApi
	DB.Where("path = ? AND method = ?", path, method).First(&api)
	return api.ID != 0
}

// @Summary 新增API
// @Description 在数据库中获取API信息
// @Tags API
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Success 200 {object} model.SysApi "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/apis [post]
func (a ApiController) Post(c *gin.Context) {
	var api = model.SysApi{}
	if err := c.ShouldBindJSON(&api); err != nil {
		response.Error(c, "绑定错误", err)
		return
	}
	if api.Path == "" || api.Method == "" {
		response.Error(c, "不允许创建一个空记录", nil)
		return
	}
	if isApiExist(api.Path, api.Method) {
		response.Fail(c, "资源路径已存在，请勿重复添加", nil)
		return
	}
	if err := DB.Create(&api).Error; err != nil {
		response.Error(c, "创建失败", err)
		return
	}
	response.Success(c, "新建资源成功", api)
}

// @Summary 获取API列表
// @Description 在数据库中获取API信息
// @Tags API
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Success 200 {object} []model.SysApi "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/apis [get]
func (a ApiController) GetList(c *gin.Context) {
	var apis []model.SysApi
	if err := DB.Debug().Find(&apis).Error; err != nil {
		response.Error(c, "查询失败", err)
		return
	}
	if len(apis) == 0 {
		response.Success(c, "资源列表为空", nil)
		return
	}
	response.Success(c, "获取资源列表成功", apis)
}

// @Summary 获取API
// @Description 在数据库中获取API信息
// @Tags API
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "api id in database"
// @Success 200 {object} model.SysApi "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/apis/{id} [get]
func (a ApiController) Get(c *gin.Context) {
	var api model.SysApi
	ids := c.Param("id")
	idx, err := strconv.Atoi(ids)
	if err != nil || idx < 1 {
		response.Fail(c, "URL路径有错误", err)
		return
	}

	if err := DB.Debug().First(&api, idx).Error; err != nil {
		response.Error(c, "查询失败", err)
		return
	}
	if api.ID == 0 {
		response.Fail(c, "资源不存在", nil)
		return
	}
	response.Success(c, "获取资源信息成功", api)

}

// @Summary 更新API
// @Description 在数据库中更新API信息
// @Tags API
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "api id in database"
// @Success 200 {object} model.SysApi "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/apis/{id} [put]
func (a ApiController) Put(c *gin.Context) {
	ids := c.Param("id")
	idx, err := strconv.Atoi(ids)
	if err != nil || idx < 1 {
		response.Fail(c, "URL路径有错误", err)
		return
	}
	var api = model.SysApi{}
	if err := c.ShouldBindJSON(&api); err != nil {
		response.Error(c, "绑定错误", nil)
		LG.Errorf("绑定出错%v\n", err)
		return
	}
	if err := DB.Model(&model.SysApi{}).Where("id = ?", idx).Updates(&api).Error; err != nil {
		response.Error(c, "更新失败", err)
		return
	}
	response.Updated(c, "更新资源信息成功", nil)
}

// @Summary 更新API
// @Description 在数据库中更新API信息
// @Tags API
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "api id in database"
// @Success 200 {object} model.SysApi "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/apis/{id} [patch]
func (a ApiController) Patch(c *gin.Context) {
	panic("implement me")
}

// @Summary 删除API
// @Description 在数据库中删除API信息
// @Tags API
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "api id in database"
// @Success 200 {object} model.SysApi "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/apis/{id} [delete]
func (a ApiController) Delete(c *gin.Context) {
	ids := c.Param("id")
	idx, err := strconv.Atoi(ids)
	if err != nil || idx < 1 {
		response.Fail(c, "URL路径有错误", err)
		return
	}
	if err := DB.Debug().Delete(&model.SysApi{}, idx).Error; err != nil {
		response.Error(c, "删除失败", err)
		return
	}
	response.Deleted(c, "删除成功", nil)
}

func NewApiController() *ApiController {
	DB.AutoMigrate(&model.SysApi{})
	return &ApiController{}
}
